grefcount ref_count;
guint resizable : 1;
+
+ guint maximized_valid : 1;
guint maximized : 1;
+ guint fullscreen_valid : 1;
guint fullscreen : 1;
GdkMonitor *fullscreen_monitor;
};
layout = g_new0 (GdkToplevelLayout, 1);
g_ref_count_init (&layout->ref_count);
layout->resizable = TRUE;
+ layout->maximized_valid = FALSE;
layout->maximized = FALSE;
+ layout->fullscreen_valid = FALSE;
layout->fullscreen = FALSE;
layout->fullscreen_monitor = NULL;
g_ref_count_init (&new_layout->ref_count);
new_layout->resizable = layout->resizable;
+ new_layout->maximized_valid = layout->maximized_valid;
new_layout->maximized = layout->maximized;
+ new_layout->fullscreen_valid = layout->fullscreen_valid;
new_layout->fullscreen = layout->fullscreen;
if (layout->fullscreen_monitor)
new_layout->fullscreen_monitor = g_object_ref (layout->fullscreen_monitor);
g_return_val_if_fail (other, FALSE);
return layout->resizable == other->resizable &&
+ layout->maximized_valid == other->maximized_valid &&
layout->maximized == other->maximized &&
+ layout->fullscreen_valid == other->fullscreen_valid &&
layout->fullscreen == other->fullscreen &&
layout->fullscreen_monitor == other->fullscreen_monitor;
}
gdk_toplevel_layout_set_maximized (GdkToplevelLayout *layout,
gboolean maximized)
{
+ layout->maximized_valid = TRUE;
layout->maximized = maximized;
}
/**
* gdk_toplevel_layout_get_maximized:
* @layout: a #GdkToplevelLayout
+ * @maximized: (out): set to %TRUE if the toplevel should be maximized
*
- * Returns whether the layout should present the
- * surface as maximized.
+ * If the layout specifies whether to the toplevel should go maximized,
+ * the value pointed to by @maximized is set to %TRUE if it should go
+ * fullscreen, or %FALSE, if it should go unmaximized.
*
- * Returns: %TRUE if the layout is maximized
+ * Returns: whether the @layout specifies the maximized state for the toplevel
*/
gboolean
-gdk_toplevel_layout_get_maximized (GdkToplevelLayout *layout)
+gdk_toplevel_layout_get_maximized (GdkToplevelLayout *layout,
+ gboolean *maximized)
{
- return layout->maximized;
+ if (layout->maximized_valid)
+ {
+ *maximized = layout->maximized;
+ return TRUE;
+ }
+
+ return FALSE;
}
/**
gboolean fullscreen,
GdkMonitor *monitor)
{
+ layout->fullscreen_valid = TRUE;
layout->fullscreen = fullscreen;
if (monitor)
layout->fullscreen_monitor = g_object_ref (monitor);
/**
* gdk_toplevel_layout_get_fullscreen:
* @layout: a #GdkToplevelLayout
+ * @fullscreen: (out): location to store whether the toplevel should be fullscreen
*
- * Returns whether the layout should cause the surface
- * to be fullscreen when presented.
+ * If the layout specifies whether to the toplevel should go fullscreen,
+ * the value pointed to by @fullscreen is set to %TRUE if it should go
+ * fullscreen, or %FALSE, if it should go unfullscreen.
*
- * Returns: %TRUE if @layout is fullscreen
+ * Returns: whether the @layout specifies the fullscreen state for the toplevel
*/
gboolean
-gdk_toplevel_layout_get_fullscreen (GdkToplevelLayout *layout)
+gdk_toplevel_layout_get_fullscreen (GdkToplevelLayout *layout,
+ gboolean *fullscreen)
{
- return layout->fullscreen;
+ if (layout->fullscreen_valid)
+ {
+ *fullscreen = layout->fullscreen;
+ return TRUE;
+ }
+
+ return FALSE;
}
/**
guint decorated : 1;
guint deletable : 1;
guint destroy_with_parent : 1;
- guint fullscreen_initially : 1;
guint minimize_initially : 1;
guint is_active : 1;
- guint maximize_initially : 1;
guint mnemonics_visible : 1;
guint focus_visible : 1;
guint modal : 1;
GList *foci;
GtkConstraintSolver *constraint_solver;
- GdkToplevelLayout *layout;
int surface_width;
int surface_height;
GtkWindowLastGeometryInfo last;
};
-
static void gtk_window_constructed (GObject *object);
static void gtk_window_dispose (GObject *object);
static void gtk_window_finalize (GObject *object);
static void _gtk_window_set_is_active (GtkWindow *window,
gboolean is_active);
static void gtk_window_present_toplevel (GtkWindow *window);
-static void gtk_window_update_toplevel (GtkWindow *window);
-static GdkToplevelLayout * gtk_window_compute_layout (GtkWindow *window);
+static void gtk_window_update_toplevel (GtkWindow *window,
+ GdkToplevelLayout *layout);
static void gtk_window_release_application (GtkWindow *window);
g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
- if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
- return priv->maximized;
- else
- return priv->maximize_initially;
+ return priv->maximized;
}
/**
g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
- if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
- return priv->fullscreen;
- else
- return priv->fullscreen_initially;
+ return priv->fullscreen;
}
void
g_list_free_full (priv->foci, (GDestroyNotify) gtk_pointer_focus_unref);
priv->foci = NULL;
- g_clear_pointer (&priv->layout, gdk_toplevel_layout_unref);
gtk_window_set_focus (window, NULL);
gtk_window_set_default_widget (window, NULL);
}
static GdkToplevelLayout *
-gtk_window_compute_layout (GtkWindow *window)
+gtk_window_compute_base_layout (GtkWindow *window)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
GdkToplevelLayout *layout;
layout = gdk_toplevel_layout_new ();
gdk_toplevel_layout_set_resizable (layout, priv->resizable);
- gdk_toplevel_layout_set_maximized (layout, priv->maximize_initially);
- gdk_toplevel_layout_set_fullscreen (layout,
- priv->fullscreen_initially,
- priv->initial_fullscreen_monitor);
return layout;
}
gtk_window_present_toplevel (GtkWindow *window)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+ GdkToplevelLayout *layout;
- if (!priv->layout)
- priv->layout = gtk_window_compute_layout (window);
-
- gdk_toplevel_present (GDK_TOPLEVEL (priv->surface), priv->layout);
+ layout = gtk_window_compute_base_layout (window);
+ gdk_toplevel_layout_set_maximized (layout, priv->maximized);
+ gdk_toplevel_layout_set_fullscreen (layout, priv->fullscreen,
+ priv->initial_fullscreen_monitor);
+ gdk_toplevel_present (GDK_TOPLEVEL (priv->surface), layout);
+ gdk_toplevel_layout_unref (layout);
}
static void
-gtk_window_update_toplevel (GtkWindow *window)
+gtk_window_update_toplevel (GtkWindow *window,
+ GdkToplevelLayout *layout)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
- {
- g_clear_pointer (&priv->layout, gdk_toplevel_layout_unref);
- priv->layout = gtk_window_compute_layout (window);
-
- gdk_toplevel_present (GDK_TOPLEVEL (priv->surface), priv->layout);
- }
+ gdk_toplevel_present (GDK_TOPLEVEL (priv->surface), layout);
+ gdk_toplevel_layout_unref (layout);
}
static void
GtkWindow *window = GTK_WINDOW (widget);
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
GtkWidget *child = priv->child;
- GdkToplevelState state;
GTK_WIDGET_CLASS (gtk_window_parent_class)->unmap (widget);
gdk_surface_hide (priv->surface);
- state = gdk_toplevel_get_state (GDK_TOPLEVEL (priv->surface));
- priv->minimize_initially = (state & GDK_TOPLEVEL_STATE_MINIMIZED) != 0;
- priv->maximize_initially = (state & GDK_TOPLEVEL_STATE_MAXIMIZED) != 0;
-
if (priv->title_box != NULL)
gtk_widget_unmap (priv->title_box);
if (changed_mask & GDK_TOPLEVEL_STATE_FULLSCREEN)
{
priv->fullscreen = (new_surface_state & GDK_TOPLEVEL_STATE_FULLSCREEN) ? TRUE : FALSE;
- priv->fullscreen_initially = priv->fullscreen;
g_object_notify_by_pspec (G_OBJECT (widget), window_props[PROP_FULLSCREENED]);
}
if (changed_mask & GDK_TOPLEVEL_STATE_MAXIMIZED)
{
priv->maximized = (new_surface_state & GDK_TOPLEVEL_STATE_MAXIMIZED) ? TRUE : FALSE;
- priv->maximize_initially = priv->maximized;
g_object_notify_by_pspec (G_OBJECT (widget), window_props[PROP_MAXIMIZED]);
}
priv->minimize_initially = FALSE;
- gtk_window_update_toplevel (window);
+ gtk_window_update_toplevel (window,
+ gtk_window_compute_base_layout (window));
}
/**
gtk_window_maximize (GtkWindow *window)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
- gboolean was_maximized_initially;
g_return_if_fail (GTK_IS_WINDOW (window));
- was_maximized_initially = priv->maximize_initially;
- priv->maximize_initially = TRUE;
-
if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
{
- gtk_window_update_toplevel (window);
+ GdkToplevelLayout *layout;
+
+ layout = gtk_window_compute_base_layout (window);
+ gdk_toplevel_layout_set_maximized (layout, TRUE);
+ gtk_window_update_toplevel (window, layout);
}
- else if (!was_maximized_initially)
+ else if (!priv->maximized)
{
+ priv->maximized = TRUE;
g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_MAXIMIZED]);
}
}
gtk_window_unmaximize (GtkWindow *window)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
- gboolean was_maximized_initially;
g_return_if_fail (GTK_IS_WINDOW (window));
- was_maximized_initially = priv->maximize_initially;
- priv->maximize_initially = FALSE;
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
+ {
+ GdkToplevelLayout *layout;
- gtk_window_update_toplevel (window);
+ layout = gtk_window_compute_base_layout (window);
+ gdk_toplevel_layout_set_maximized (layout, FALSE);
+ gtk_window_update_toplevel (window, layout);
+ }
+ else if (priv->maximized)
+ {
+ priv->maximized = FALSE;
+ g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_MAXIMIZED]);
+ }
+}
- if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
- gtk_window_update_toplevel (window);
- else if (was_maximized_initially)
- g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_MAXIMIZED]);
+static void
+unset_fullscreen_monitor (GtkWindow *window)
+{
+ GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+
+ if (priv->initial_fullscreen_monitor)
+ {
+ g_signal_handlers_disconnect_by_func (priv->initial_fullscreen_monitor, unset_fullscreen_monitor, window);
+ g_object_unref (priv->initial_fullscreen_monitor);
+ priv->initial_fullscreen_monitor = NULL;
+ }
}
/**
gtk_window_fullscreen (GtkWindow *window)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
- gboolean was_fullscreen_initially;
g_return_if_fail (GTK_IS_WINDOW (window));
- was_fullscreen_initially = priv->fullscreen_initially;
- priv->fullscreen_initially = TRUE;
+ unset_fullscreen_monitor (window);
if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
- gtk_window_update_toplevel (window);
- else if (!was_fullscreen_initially)
- g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_FULLSCREENED]);
-}
-
-static void
-unset_fullscreen_monitor (GtkWindow *window)
-{
- GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
+ {
+ GdkToplevelLayout *layout;
- if (priv->initial_fullscreen_monitor)
+ layout = gtk_window_compute_base_layout (window);
+ gdk_toplevel_layout_set_fullscreen (layout, TRUE, NULL);
+ gtk_window_update_toplevel (window, layout);
+ }
+ else if (!priv->fullscreen)
{
- g_signal_handlers_disconnect_by_func (priv->initial_fullscreen_monitor, unset_fullscreen_monitor, window);
- g_object_unref (priv->initial_fullscreen_monitor);
- priv->initial_fullscreen_monitor = NULL;
+ priv->fullscreen = TRUE;
+ g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_FULLSCREENED]);
}
}
G_CALLBACK (unset_fullscreen_monitor), window);
g_object_ref (priv->initial_fullscreen_monitor);
- priv->fullscreen_initially = TRUE;
+ if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
+ {
+ GdkToplevelLayout *layout;
- gtk_window_update_toplevel (window);
+ layout = gtk_window_compute_base_layout (window);
+ gdk_toplevel_layout_set_fullscreen (layout, TRUE, monitor);
+ gtk_window_update_toplevel (window, layout);
+ }
+ else if (!priv->fullscreen)
+ {
+ priv->fullscreen = TRUE;
+ g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_FULLSCREENED]);
+ }
}
/**
gtk_window_unfullscreen (GtkWindow *window)
{
GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
- gboolean was_fullscreen_initially;
g_return_if_fail (GTK_IS_WINDOW (window));
- was_fullscreen_initially = priv->fullscreen_initially;
unset_fullscreen_monitor (window);
- priv->fullscreen_initially = FALSE;
-
- gtk_window_update_toplevel (window);
if (_gtk_widget_get_mapped (GTK_WIDGET (window)))
- gtk_window_update_toplevel (window);
- else if (was_fullscreen_initially)
- g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_FULLSCREENED]);
+ {
+ GdkToplevelLayout *layout;
+
+ layout = gtk_window_compute_base_layout (window);
+ gdk_toplevel_layout_set_fullscreen (layout, FALSE, NULL);
+ gtk_window_update_toplevel (window, layout);
+ }
+ else if (priv->fullscreen)
+ {
+ priv->fullscreen = FALSE;
+ g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_FULLSCREENED]);
+ }
}
/**